#ifndef _TSP_MEASUREMENT_H_
#define _TSP_MEASUREMENT_H_

#include "msgQLib.h"
#include "system_information.h"
#include "platform.h"
#include "Indicate.h"
#include "tcs_struct.h"
#include "tss_typedef.h"

#include "vxWorks.h" 
#include "sockLib.h" 
#include "inetLib.h" 
#include "stdioLib.h" 
#include "strLib.h" 
#include "hostLib.h" 
#include "ioLib.h" 
#include "tcp_struct.h" 

/**
*@brief 度量类。用户可通过ininCMD函数初始化可信命令，\n
*				使用getCPUResult()以及getSoftResult()获取相应的信息。
*/
class cMeasurement{

	public:
		
	  /**
      * @brief 本函数用于获取本地的平台硬件信息
      * @param [out] p 存储硬件信息的结构体
	  * @retval TSP_MEA_SUCCESS 函数执行成功
      * @retval TSP_NULL_POINTER 参数空指针错误
      * @retval TSP_NULL_QUEUE 消息队列错误
      */
		TSS_RESULT getHardwareInfo(OUT  PCPUINFO p);
	  /**
      * @brief 本函数用于获取远程的平台硬件信息
	  * @param [in] ip 远程TPM板的ip地址
      * @param [out] p 存储硬件信息的结构体
	  * @retval TSP_MEA_SUCCESS 函数执行成功
      * @retval TSP_NULL_POINTER 参数空指针错误     
	  * @retval TSP_FAIL_TCP TCP通信错误
      */		
		TSS_RESULT getHardwareInfo(IN char* ip, OUT  PCPUINFO p);
		
			
	  /**
      * @brief 本函数用于获取本地的平台软件信息
      * @param [out] p 存储软件信息的结构体
	  * @retval TSP_MEA_SUCCESS 函数执行成功
      * @retval TSP_NULL_POINTER 参数空指针错误
      * @retval TSP_NULL_QUEUE 消息队列错误
      */
		TSS_RESULT getSoftwareInfo(OUT  PSOFTINFO p);
		
	  /**
      * @brief 本函数用于获取远程的平台软件信息
	  * @param [in] ip 远程TPM板的ip地址
      * @param [out] p 存储软件信息的结构体
	  * @retval TSP_MEA_SUCCESS 函数执行成功
      * @retval TSP_NULL_POINTER 参数空指针错误     
	  * @retval TSP_FAIL_TCP TCP通信错误
      */			
		TSS_RESULT getSoftwareInfo(IN char* ip, OUT  PSOFTINFO p);
				
	  /**
      * @brief 本函数用于对软件进行动态度量
	  * @param [in] length 程序文本的长度
      * @param [in]	parameter 程序文本的起始地址
	  * @retval TSP_MEA_SUCCESS 函数执行成功
      * @retval TSP_NULL_POINTER 参数空指针错误     
	  * @retval TSP_NULL_QUEUE 消息队列错误
	  * @retval TSP_PROGRAM_FAIL 软件度量失败
      */	
		TSS_RESULT programVerify(IN UINT32 length, IN BYTE* parameter);
		
	   /**
      * @brief 本函数用于对软件进行动态度量
	  * @param [in] length 程序文本的长度
      * @param [in]	parameter 程序文本的起始地址
	  * @param [in] ip	远程TPM板的ip地址
	  * @retval TSP_MEA_SUCCESS 函数执行成功
      * @retval TSP_NULL_POINTER 参数空指针错误     
	  * @retval TSP_FAIL_TCP TCP通信错误
	  * @retval TSP_PROGRAM_FAIL 软件度量失败
      */	
		TSS_RESULT programVerify(IN UINT32 length, IN BYTE* parameter, IN char* ip);					 
		
	  /**
      * @brief 本函数用于对平台信息进行度量
	  * @param [in] pCpuInfo 平台硬件信息结构体
      * @param [in]	pSoftInfo 平台软件信息结构体
	  * @retval TSP_MEA_SUCCESS 函数执行成功
      * @retval TSP_NULL_POINTER 参数空指针错误     
	  * @retval TSP_NULL_QUEUE 消息队列错误
	  * @retval TSP_PLATFORM_FAIL 平台度量失败
      */	
		TSS_RESULT platformVerify(IN PCPUINFO pCpuInfo, IN PSOFTINFO pSoftInfo);
		
	  /**
      * @brief 本函数用于对平台信息进行度量
	  * @param [in] pCpuInfo 平台硬件信息结构体
      * @param [in]	pSoftInfo 平台软件信息结构体
	  * @param [in]ip 远程TPM板的ip地址
	  * @retval TSP_MEA_SUCCESS 函数执行成功
      * @retval TSP_NULL_POINTER 参数空指针错误     
	  * @retval TSP_FAIL_TCP TCP通信错误
	  * @retval TSP_PLATFORM_FAIL 平台度量失败
      */
		TSS_RESULT platformVerify(IN PCPUINFO pCpuInfo, IN PSOFTINFO pSoftInfo, IN char* ip);
			
	private:
		/** @brief 用于接收执行结果的消息队列的ID号*/
		MSG_Q_ID msgResponse;
		/** @brief 可信请求内容*/
		PTrustReq pMea;
		/** @brief 请求服务的消息队列结构体*/
		MSG_Ask node;
		/** @brief 接收执行结果的消息队列长度*/
		int numMsg;
		
		int priority;
		/** @brief 参数统一放置位置*/
		UINT32 parameterBuffer[40];
		/** @brief 生成对应命令的优先级*/
		UINT32 getPriority();
		
		
   
    
   
    
   
    
   
   
   
		
		
};
#endif
